package com.xingu.xg.utils;


import com.xingu.xg.dto.NodesDto;
import com.xingu.xg.pojo.Nodes;
import org.springframework.beans.BeanUtils;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 生成菜单树
 */
public class MenuTree {
    /**
     * 生成树形结构
     *
     * @param nodeList 节点列表
     * @param pid      父节点ID
     * @return 树形结构的列表
     */
    public static List<NodesDto> makeTree(List<Nodes> nodeList, Integer pid) {
        List<NodesDto> treeList = new ArrayList<>();
        if (nodeList != null) {
            // 过滤出所有父节点ID等于pid的节点
            List<Nodes> parentNodes = nodeList.stream()
                    .filter(node -> node.getParentId().equals(pid))
                    .collect(Collectors.toList());

            // 为每个父节点创建一个树节点
            for (Nodes parent : parentNodes) {
                // 创建树节点对象
                NodesDto treeNode = new NodesDto();
                BeanUtils.copyProperties(parent, treeNode);
                // 递归获取子节点
                List<NodesDto> children = makeTree(nodeList, parent.getNodeId());
                // 排序
                children.sort(Comparator.comparingInt(NodesDto::getSortOrder));
                treeNode.setChildren(children); // 假设Nodes类有setChildren方法
                treeList.add(treeNode);
            }
        }
        return treeList;
    }

    /**
     * 根据节点id拿到下面所有的子节点
     * @param nodeList      存放所有子孙节点
     * @param parentId
     * @param flatList
     */
    public static void flattenTreeRecursive(List<Nodes> nodeList, Integer parentId, List<Nodes> flatList) {
        if (nodeList != null) {
            // 过滤出所有父节点ID等于parentId的节点
            List<Nodes> children = nodeList.stream()
                    .filter(node -> node.getParentId().equals(parentId))
                    .sorted(Comparator.comparingInt(Nodes::getSortOrder))
                    .collect(Collectors.toList());

            // 将当前层级的节点添加到扁平列表中
            for (Nodes child : children) {
                flatList.add(child);
                // 递归调用，继续获取下一层级的节点
                flattenTreeRecursive(nodeList, child.getNodeId(), flatList);
            }
        }
    }
}